Docker 笔记 Part1: 基础
前言
容器化技术也是虚拟化技术,相对来说容器化比传统的虚拟化要优势。虚拟化技术是将计算资源抽象化、隔离和管理的技术。它允许在单个物理服务器上运行多个虚拟计算环境,每个环境都可以独立地运行操作系统和应用程序。虚拟化技术的主要目标是提高硬件资源利用率、降低管理成本、提高灵活性和可扩展性。虚拟化技术一般包括,虚拟机 (Virtual Machine),宿主机/客户机 (Host Machine) 和虚拟机监控器 (Hypervisor,是一个虚拟化管理程序,负责在物理服务器上创建、管理虚拟机)。容器化技术是一种充分利用了操作系统本身已有的机制和特性,实现远超传统虚拟机的轻量级虚拟化技术。容器化是操作系统级虚拟化,内核可以创建多个虚拟的操作系统实例,隔离不同进程。
虚拟化技术
在计算机技术中,虚拟化是一种资源管理技术,是将计算机的各种实体资源,如服务器、网络、内存及存储等,予以抽象、转换后呈现出来,打破实体结构间的不可切割的障碍,使用户可以用比原本的组态更好的方式来应用这些资源。
虚拟化的核心是对资源的抽象,目标往往是为了在同一个主机上同时运行多个系统或应用,从而提高系统资源的利用率,并且带来降低成本、方便管理和容错容灾等好处。从大类上分,虚拟化技术可分为基于硬件的虚拟化和基于软件的虚拟化。其中,真正意义上的基于硬件的虚拟化技术不多见,少数如网卡中的单根多IO虚拟化(Single Root I/O Virtualization and Sharing Specification, SR-IOV)等技术,也超出了本书的讨论范畴。基于软件的虚拟化从对象所在的层次,又可以分为应用虚拟化和平台虚拟化(通常说的虚拟机技术即属于这个范畴)。前者一般指的是一些模拟设备或诸如Wine这样的软件,后者又可以细分为几个子类
- 完全虚拟化 虚拟机模拟完整的底层硬件环境和特权指令的执行过程,客户操作系统无须进行修改。例如IBM p和z系列的虚拟化、VMware Workstation、VirtualBox、QEMU等
- 硬件辅助虚拟化 利用硬件(主要是CPU)辅助支持(目前x86体系结构上可用的硬件辅助虚拟化技术包括Intel-VT和AMD-V)处理敏感指令来实现完全虚拟化的功能,客户操作系统无须修改,例如VMware Workstation, Xen, KVM
- 部分虚拟化 只针对部分硬件资源进行虚拟化,客户操作系统需要进行修改。现在有些虚拟化技术的早期版本仅支持部分虚拟化
- 超虚拟化(paravirtualization) 部分硬件接口以软件的形式提供给客户机操作系统,客户操作系统需要进行修改,例如早期的Xen
- 操作系统级虚拟化 内核通过创建多个虚拟的操作系统实例(内核和库)来隔离不同的进程
Docker 简介
Docker 最初发起者是 dotCloud 公司于 2013 年开发(目前已开源),目前已有80多个相关开源组件项目(包括Containerd、Moby、Swarm等),逐渐形成了围绕Docker容器的完整的生态体系。Docker的构想是要实现“Build, Ship and Run Any App, Anywhere”,即通过对应用的封装(Packaging)、分发(Distribution)、部署(Deployment)、运行(Runtime)生命周期进行管理,达到应用组件级别的“一次封装,到处运行”。这里的应用组件,既可以是一个Web应用、一个编译环境,也可以是一套数据库平台服务,甚至是一个操作系统或集群。基于Linux平台上的多项开源技术,Docker提供了高效、敏捷和轻量级的容器方案,并支持部署到本地环境和多种主流云平台。可以说,Docker首次为应用的开发、运行和部署提供了“一站式”的实用解决方案。
容器技术,实现了轻量级的环境隔离,不需要像虚拟机完全安装一个操作系统。Docker与虚拟机比较作为一种轻量级的虚拟化方式,Docker在运行应用上跟传统的虚拟机方式相比具有如下显著优势:
- Docker容器很快,启动和停止可以在秒级实现,这相比传统的虚拟机分钟级要快得多
- Docker容器对系统资源需求很少,可运行的实例比传统虚拟机多
- Docker 运维更加方便,通过版本设计理念的操作来方便用户获取、分发和更新应用镜像,存储复用,增量更新
- Docker 通过 Dockerfile 支持灵活的自动化创建和部署机制,以提高工作效率,并标准化流程
传统方式是在硬件层面实现虚拟化,需要有额外的虚拟机管理应用和虚拟机操作系统层。Docker容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,因此更加轻量级。
Docker 分层和联合文件系统
Docker 联合文件系统(Union File System)是 Docker 容器镜像的基础,它可以让容器的文件系统层叠加并发挥作用。联合嗯见系统的特点:
- 层叠加 Docker 联合文件系统允许多个文件系统通过层叠加方式组合成一个单一的文件系统。在 Docker 中,每个镜像都由一系列只读层和一个可写层组成
- 映像共享:多个容器可以共享同一个基础镜像,并在需要时创建自己的可写层。这大大节约了磁盘空间和网络带宽
- 只读层与可写层:Docker 镜像的每个只读层都是不可变的,一旦创建就不能修改。可写层负责容器的运行时修改。当容器运行时,Docker 引擎会将所有只读层和容器的可写层合并,为容器提供一个统一的文件系统视图
- 复制和写时复制(Copy-on-Write):当容器需要修改文件时,Docker 联合文件系统使用复制和写时复制机制,即先将只读层中的文件复制到可写层,然后在可写层上进行修改。这种机制可以有效地节省空间和提高性能
- Docker 联合文件系统通过层叠加和复制和写时复制机制,使容器可以有效地共享磁盘空间和网络带宽,同时还提供了一个灵活且高效的机制来管理容器的文件系统
Docker 有一个基础的 Bootfs 包括 bootloader 和 kernel bootloader,他们主要是引导和搭载 kernel,即是 Linux 启动事加载 bootfs。之后会有一个 Rootfs,包括了典型的 Linux 系统标准目录和文件——这些文件因不同的系统发行版本差异而存在差异。之后的其他服务和依赖,都是在 Rootfs 上。
对于服务的所有操作都是在容器层中进行的,并不会改变基础层信息。即使是需要读写或者修改容器中文件,会自上而下找到相关的文件存放到容器中。而对于删除文件时,它只是记录删除操作(表现上会是删除了文件),但底层并没有被删除。
Dcoker 常用命令
- 查询所有镜像:
docker images -aq
- 查询所有容器:
docker ps -aq
- 配合上删除命令可以直接删除全部镜像和容器(需要注意使用 反引号将以上命令框住)
- 镜像导出:
docker image save <镜像信息> > <文件名>
- 镜像导入:
docker image load -i <文件名>
- 查询容器内执行的日志信息:
docker logs <容器信息>
- 进入运行的容器:
docker exec -it <容器信息> /bin/bash
- 查询容器端口信息:
docker port <容器信息>
- 容器提交为新的镜像:
docker commit <容器ID> <新镜像名称>
- 指定镜像名称:
docker tag <镜像ID> <给定的镜像名称>
- 重启容器:
docker restart <容器信息>
Docker 笔记 Part1: 基础
https://zenray.github.io/[object%20Object]/Docker-%E7%AC%94%E8%AE%B0Part1/